package zyj.yihong.leetcode.mid.other;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 890. 查找和替换模式
 * 你有一个单词列表 words 和一个模式  pattern，你想知道 words 中的哪些单词与模式匹配。
 *
 * 如果存在字母的排列 p ，使得将模式中的每个字母 x 替换为 p(x) 之后，我们就得到了所需的单词，那么单词与模式是匹配的。
 *
 * （回想一下，字母的排列是从字母到字母的双射：每个字母映射到另一个字母，没有两个字母映射到同一个字母。）
 *
 * 返回 words 中与给定模式匹配的单词列表。
 */
public class FindAndReplacePattern890 {
    public static List<String> findAndReplacePattern(String[] words, String pattern) {
        // 满足双射关系
        List<String> ans = new ArrayList<>();
        int[] wordMap = new int[26];
        int[] patternMap = new int[26];

        for (String word : words) {
            Arrays.fill(wordMap,-1);
            Arrays.fill(patternMap,-1);
            boolean flag  = true;
            if (word.length()!=pattern.length()){
                continue;
            }
            for (int i = 0; i < word.length(); i++) {
                char w = word.charAt(i);
                char p = pattern.charAt(i);
                if (wordMap[w-'a']==-1){
                    wordMap[w-'a'] = p-'a';
                }

                if (patternMap[p-'a']==-1){
                    patternMap[p-'a']=w-'a';
                }

                if (!(wordMap[w-'a']==p-'a'&&patternMap[p-'a']==w-'a')){
                    flag = false;
                    break;
                }
            }
            if (flag){
                ans.add(word);
            }
        }
        return ans;
    }

    public static void main(String[] args) {
        String[] arr = {"abc","deq","mee","aqq","dkd","ccc"};
        String p = "abb";
        List<String> andReplacePattern = findAndReplacePattern(arr, p);
        System.out.println((andReplacePattern));
    }
}
